package String;

public class StringDemo {
    public static final String S = "ABC";
    public static void main(String[] args) {
        String s = "刘一楼";
        char[] chs = {'刘','一','楼'};
        String s1 = new String(chs);
        //字符串是类型,可以使用new String() 创建对象
        //创建的对象和双引号创建的一样
        System.out.println(s);
        System.out.println(s1);

        char[] cs = {'1','2','3','4','5','6','7','8','9'};
        System.out.println(cs);


        /*
        字符串对象是不变的
        字符串对象一但创建就不会在改变

         */
        String a1 = "123";
        String a2 = "456";
        String a3 = a1;
        a1 = a1+a2;
        System.out.println(a1);

        /*
        字符串常量池
         */
        String b1 = "ABC";//"字面量被缓存到常量池"
        //同样的字面量会替换为常量池中同一个对象的引用
        String b2 = "ABC";
        // b1 b2 引用了同一个对象 利用 == 可以检查地址是否一样
        System.out.println(b1 == b2);
        //利用new运算动态创建的字符串
//        char[] chs = {'A','B','C'};
//        String b3 = new String(chs);
//        System.out.println(chs);
//        System.out.println(b1 == b3);

        String b4 = "ABC";
        System.out.println(b4 == S);

        String b5 = "AB";
        String b6 = b5+"C";
        System.out.println(b6 ==b1);

        //如下代码创建了几个对象
        String str = new String("ABC");
        //运算过程分析
        /*
        1.java 创建了字符串对象"ABC"被缓存到常量池
        2.new 运算调用了字符串的构造器创建一个新字符串
            在内存中生成一个新字符串对象"ABC"
            结论:上述代码创建了 两个新字符串对象
         */

    }
}
